#ifndef JI_SAMPLEALGORITHMMIX_H
#define JI_SAMPLEALGORITHMMIX_H
#include <string>
#include <opencv2/core/core.hpp>

#include "ji.h"
#include "Configuration.hpp"
#include "SampleDetector.h"

using namespace std;
using namespace cv;

class SampleAlgorithmMix
{

public:
    
    SampleAlgorithmMix();
    ~SampleAlgorithmMix();

    /*
     * @breif 初始化算法运行资源
     * @return JiErrorCode 返回调用结果,成功返回JiErrorCode_SUCCESS
    */    
    JiErrorCode Init();

    /*
     * @breif 去初始化，释放算法运行资源
     * @return JiErrorCode 返回调用结果,成功返回JiErrorCode_SUCCESS
    */    
    JiErrorCode UnInit();

    /*
     * @breif 算法业务处理函数，输入分析图片，返回算法分析结果
     * @param inFrame 输入图片对象  
     * @param args 输入算法参数, json字符串
     * @param event 返回的分析结果结构体
     * @return 返回结果, JiErrorCode_SUCCESS代表调用成功
    */    
    JiErrorCode Process(bm_image &inFrame, const std::string &baseParams, const std::vector<JiAlgoParam> &params, std::vector<JiOutput> &outInfos);

    void setOutPut(std::vector<BoxInfo> &re, const JiAlgoParam& param,JiOutput &outInfos, int index);

    JiErrorCode UpdateConfig(const char *args);

    void  initConfigMap();
private:
    cv::Mat mOutputFrame;    // 用于存储算法处理后的输出图像，根据ji.h的接口规范，接口实现需要负责释放该资源    
    JiImageInfo mOutImage[1];
    unsigned int mOutCount = 1;//本demo每次仅分析处理一幅图    
    // Configuration mConfig;     //跟配置相关的类
    std::vector<cv::Mat> mOutImageVec;
    std::vector<std::string> mOutJsonVec; 
    std::vector<JiImageInfo> mOutJiImageInfoVec;
private:
    std::string mStrLastArg;  //算法参数缓存,动态参数与缓存参数不一致时才会进行更新  
    std::string mStrOutJson;  //返回的json缓存,注意当算法实例销毁时,对应的通过算法接口获取的json字符串也将不在可用
    std::shared_ptr<SampleDetector> mDetector0{nullptr}; //算法检测器实例
    std::shared_ptr<SampleDetector> mDetector1{nullptr}; //算法检测器实例
    std::map<std::string, Configuration> mConfigMap;
};

#endif //JI_SAMPLEALGORITHM_HPP
